#============================================
# #知识点
# 类也是"容器"，该容器用来存放同类对象共有的数据与功能
#============================================
# ​ 综上所述，虽然我们是先介绍对象后介绍类
# 但是需要强调的是：在程序中，"""""必须要事先定义类，然后再调用类产生对象（调用类拿到的返回值就是对象）"""""。
# 产生对象的类与对象之间存在关联，这种关联指的是：对象可以访问到类中共有的数据与功能，
# 所以类中的内容仍然是属于对象的，类只不过是一种节省空间、减少代码冗余的机制，面向对象编程最终的核心仍然是去使用对象。
#============================================S
# #先定义类：使用class Student(类得名字用驼峰体)定义一个类
# class Student():
#     #一般类中存放着对象中相同的数据与功能，不过在类中也可以写其他的程序。
#     #类体代码在定义阶段就会立即执行
#     print("=======武昌首义学院========")

#     #变量(数据)定义
#     school = "武昌首义学院"

#     #功能定义
#     #__init_方法，创建对象(调用类)时，自动调用此函数
#     #总结__init__ 方法
#     # 1、会在调用类时自动触发执行，用来为对象初始化自己独有的数据
#     # 2、__init__ 内应该存放是为对象初始化属性的功能，但是是可以存放任意其他代码，想要在
#     #类调用时就立刻执行的代码都可以放到该方法内
#     # 3、__init__ 方法必须返回None
#     def __init__(func,name,age,gender):
#         #属性访问，添加dic键的值
#         func.name = name
#         func.age = age
#         func.gender = gender


#     def show_info(func):
#         print(f"姓名：{func.name},年龄：{func.age},性别：{func.gender}")

#     def change_info(func,x,y,z):
#         func.name=x
#         func.age=y
#         func.gender=z

# # #属性访问语法(了解),添加可以直接在类中添加代码就可
# # Student.school = "武昌首义学院啊" #改了school属性
# # Student.type = "本科" #添加type 属性
# # print(Student.__dict__) #查看字典空间


# #调用类产生一个对象（只要调用一个对象给予赋值就可以产生一个对象）
# #创建对象(实例化一个对象)调用__init__时，它会以对象本身作为第一个参传进__init_函数,没有对象则为空对象
# stu_d1 = Student("冯彬恢",21,"男") 
# stu_d2 = Student("杨志伟",21,"男")
# stu_d3 = Student("余希峰",20,"男")

# # print(stu_d1.__dict__)
# # print(stu_d2.__dict__)
# # print(stu_d3.__dict__)

# #给对象添加属性与类添加方法一样都可以使用属性访问(只不过类是全体的那个dic，对象是对象本身的那个dic)
# #(了解即可)，因为有多个对象的话，就会不挺重复次功能，麻烦,python有专用方法__init__
# #通过属性访问，来给对象添加对应的值
# # stu_d1.name = "冯彬恢"
# # stu_d1.age = 21
# # stu_d1.gendef = "男"
# # print(stu_d1.__dict__)

# # #类的属性都是给对象用的，大家访问的id都一样
# # print(Student.school)
# # print(stu_d1.school)
# # print(stu_d2.school)
# # print(stu_d3.school)

# # #单独对对象进行赋值操作,是对它自己得名称空间进行操作,如果类中也有一个shcool属性并不会改类中值，
# # #并不会改变类中school，而是在自己得名称空间创建一个school属性
# # #首先得知道类寻找值得方法,先以从自己名称空间中找，如果没有就会到类中去寻找
# # stu_d1.school = "武大"
# # print(stu_d1.school)


# #类调用函数  按照函数得参数进行调用
# Student.show_info(stu_d1)
# Student.change_info(stu_d1,"冯彬恢plus",21,"男")
# Student.show_info(stu_d1)
# #对象调用函数  会把对象本身当第一次参数传送给函数(绑定方法)，不同调用同一个函数会产生不同得函数空间
# #注:在类中定义一个函数，最好给他定义一个参数建议用(self),为了给对象得绑定方法使用
# stu_d1.show_info()
# stu_d1.change_info("冯彬恢plus",22,"男")
# stu_d1.show_info()
#============================================
# 模板
if __name__ == "__main__":
    class Student():
        school = "武昌首义学院"

        def __init__(self,name,age,gender,height,weight,crouse="暂时没选课"):
            self.name = name
            self.age = age
            self.gender = gender
            self.height = height
            self.weight = weight
            self.crouses = crouse
            
        def show(self):
            print(f"姓名:{self.name}--年龄:{self.age}--性别:{self.gender}--身高:{self.height}--体重:{self.weight}--学校:{self.school}--选课:{self.crouses}")

        def change(self,name,age,gender,height,weight):
            self.name = name
            self.age = age
            self.gender = gender
            self.height = height
            self.weight = weight

        def crouse(self,crouse):
            self.crouses = self.crouses.strip("暂时没选课")+f"{crouse}|"

student = Student("小黑",18,"男",175,120)
student.show()
student.change("小黑",18,"女",175,120)
student.show()
student.crouse("python全栈开发")
student.show()
student.crouse("linux运维")
student.show()
student.crouse("c语言")
student.show()
#============================================

